// 字符集（数字和大写字母，去掉I、O、Z、S、V）
const CHARS = '0123456789ABCDEFGHJKLMNPQRTUWXY';

// 登记管理部门代码
const DEPARTMENT_CODES = {
    '1': '1', // 机构编制
    '2': '2', // 外交
    '3': '3', // 工商
    '4': '4', // 民政
    '5': '5', // 司法
    '9': '9'  // 其他
};

// 机构类别代码映射
const ORG_TYPE_CODES = {
    '1': ['1', '2', '3', '9'], // 机构编制
    '2': ['1', '2', '3', '9'], // 外交
    '3': ['1', '2', '3', '9'], // 工商
    '4': ['1', '2', '3', '9'], // 民政
    '5': ['1', '2', '3', '9'], // 司法
    '9': ['1', '2', '3', '9']  // 其他
};

// 生成随机数字
function getRandomNum(min, max) {
    return Math.floor(Math.random() * (max - min + 1) + min);
}

// 生成随机字符
function getRandomChar() {
    return CHARS[getRandomNum(0, CHARS.length - 1)];
}

// 生成6位行政区划码
function generateAreaCode() {
    // 省级代码（2位）
    const provinceCode = getRandomNum(11, 65).toString();
    // 市级代码（2位）
    const cityCode = getRandomNum(1, 99).toString().padStart(2, '0');
    // 区级代码（2位）
    const districtCode = getRandomNum(1, 99).toString().padStart(2, '0');
    
    return provinceCode + cityCode + districtCode;
}

// 生成9位主体标识码
function generateOrgCode() {
    return Array(9).fill(0).map(() => getRandomChar()).join('');
}

// 计算校验码
function calculateCheckCode(code17) {
    const weights = [1, 3, 9, 27, 19, 26, 16, 17, 20, 29, 25, 13, 8, 24, 10, 30, 28];
    let sum = 0;
    
    for (let i = 0; i < 17; i++) {
        const char = code17.charAt(i);
        const charIndex = CHARS.indexOf(char);
        if (charIndex === -1) {
            throw new Error(`Invalid character found: ${char}`);
        }
        sum += charIndex * weights[i];
    }
    
    const remainder = sum % 31;
    const checkCode = CHARS.charAt((31 - remainder) % 31);
    return checkCode;
}

// 验证统一社会信用代码是否合法
function validateCreditCode(code) {
    if (code.length !== 18) return false;
    
    // 检查是否包含非法字符
    const invalidChars = /[IOZSV]/;
    if (invalidChars.test(code)) return false;
    
    // 验证每个字符是否在允许的字符集中
    for (let char of code) {
        if (!CHARS.includes(char)) return false;
    }
    
    // 验证校验码
    try {
        const calculatedCheck = calculateCheckCode(code.slice(0, 17));
        return calculatedCheck === code.charAt(17);
    } catch (e) {
        return false;
    }
}

// 生成完整的统一社会信用代码
function generateCreditCode(orgType) {
    // 1. 登记管理部门代码（1位）
    const departmentCode = DEPARTMENT_CODES[orgType] || '9';
    
    // 2. 机构类别代码（1位）
    const orgTypeCodes = ORG_TYPE_CODES[orgType] || ORG_TYPE_CODES['9'];
    const orgTypeCode = orgTypeCodes[getRandomNum(0, orgTypeCodes.length - 1)];
    
    // 3. 行政区划码（6位）
    const areaCode = generateAreaCode();
    
    // 4. 主体标识码（9位）
    const orgCode = generateOrgCode();
    
    // 组合前17位
    const code17 = departmentCode + orgTypeCode + areaCode + orgCode;
    
    // 5. 计算校验码（1位）
    const checkCode = calculateCheckCode(code17);
    
    const fullCode = code17 + checkCode;
    
    // 验证生成的代码
    if (!validateCreditCode(fullCode)) {
        // 如果生成的代码无效，递归重试
        return generateCreditCode(orgType);
    }
    
    return fullCode;
}

// 生成指定数量的统一社会信用代码
function generateCodes(orgType, count = 1) {
    const codes = new Set(); // 使用Set避免重复
    while (codes.size < count) {
        const code = generateCreditCode(orgType);
        codes.add(code);
    }
    return Array.from(codes);
}

// 历史记录相关操作
let history = JSON.parse(localStorage.getItem('creditCodeHistory') || '[]');

function addToHistory(code) {
    if (!history.includes(code)) { // 避免重复添加
        history.unshift(code);
        if (history.length > 10) {
            history.pop();
        }
        localStorage.setItem('creditCodeHistory', JSON.stringify(history));
        updateHistoryList();
    }
}

function updateHistoryList() {
    const historyList = document.getElementById('historyList');
    historyList.innerHTML = history.map(code => `<li>${code}</li>`).join('');
}

function clearHistory() {
    history = [];
    localStorage.setItem('creditCodeHistory', JSON.stringify(history));
    updateHistoryList();
}

// DOM 操作相关代码
document.addEventListener('DOMContentLoaded', () => {
    const orgTypeSelect = document.getElementById('orgType');
    const batchCountInput = document.getElementById('batchCount');
    const generateBtn = document.getElementById('generate');
    const batchGenerateBtn = document.getElementById('batchGenerate');
    const copyBtn = document.getElementById('copy');
    const clearHistoryBtn = document.getElementById('clearHistory');
    const creditCodeTextarea = document.getElementById('creditCode');

    // 初始化历史记录
    updateHistoryList();

    // 生成按钮点击事件
    generateBtn.addEventListener('click', () => {
        const orgType = orgTypeSelect.value;
        const count = Math.min(Math.max(parseInt(batchCountInput.value) || 1, 1), 100);
        const codes = generateCodes(orgType, count);
        creditCodeTextarea.value = codes.join('\n');
        codes.forEach(addToHistory);
    });

    // 随机生成按钮点击事件
    batchGenerateBtn.addEventListener('click', () => {
        const count = Math.min(Math.max(parseInt(batchCountInput.value) || 1, 1), 100);
        const codes = generateCodes('9', count);
        creditCodeTextarea.value = codes.join('\n');
        codes.forEach(addToHistory);
    });

    // 复制按钮点击事件
    copyBtn.addEventListener('click', () => {
        if (creditCodeTextarea.value) {
            creditCodeTextarea.select();
            document.execCommand('copy');
            alert('已复制到剪贴板');
        }
    });

    // 清除历史记录按钮点击事件
    clearHistoryBtn.addEventListener('click', clearHistory);
}); 